package log

import (
	"io/ioutil"
	stlog "log"
	"net/http"
	"os"
)

var log *stlog.Logger

//创建fileLog类型，其实是string的别名
type fileLog string

//write方法，把数据写入到文件里面
func (fl fileLog) Write(data []byte) (int, error) {
	f, err := os.OpenFile(string(fl), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
	if err != nil {
		return 0, err
	}
	defer f.Close()
	return f.Write(data)

}

// 创建一个自定义的logger，会把日志写入传进来的destination地址
// 每一个日志前面都包含前缀  go，每一行都包含日期和时间

func Run(destination string) {
	log = stlog.New(fileLog(destination), "go  -  ", stlog.LstdFlags)
}

//针对 /log  路径的请求做处理
//只处理post请求，把post请求body中的内容通过write写入文件

func RegisterHandlers() {
	http.HandleFunc("/log", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodPost:
			msg, err := ioutil.ReadAll(r.Body)
			if err != nil || len(msg) == 0 {
				w.WriteHeader(http.StatusBadRequest)
				return
			}
			write(string(msg))
		default:
			w.WriteHeader(http.StatusMethodNotAllowed)
			return
		}
	})
}

//调用自定义的log，把消息写入
func write(message string) {
	log.Printf("%v\n", message)
}
